
#ifndef ARRAY2D_CPP
#define ARRAY2D_CPP

#if 1

/*
为了方便调试，先分配一块连续的内存，然后再分配每一行的内存。
这样在gdb中，可以使用 **array@size2@size1 或 (type[size1][size2])**array，查看二维数组的内容。
*/

template <typename T>
T** init2DArray(int n, int m) {
    T* temp = new T[n * m];
    T **array = new T*[n];
    for (int i = 0; i < n; i++) {
        array[i] = temp + i * m;
    }
    return array;
}

template <typename T>
T** init2DArray(int n) {
    return init2DArray<int>(n, n);
}

template <typename T>
void free2DArray(T **array, int n) {
    delete[] array[0];
    delete[] array;
}

#else

template <typename T>
T** init2DArray(int n, int m) {
    T **array = new T*[n];
    for (int i = 0; i < n; i++) {
        array[i] = new T[m];
    }
    return array;
}

template <typename T>
void free2DArray(T **array, int n) {
    for (int i = 0; i < n; i++) {
        delete[] array[i];
    }
    delete[] array;
}

#endif

#endif